<?php
/**
 * Created by PhpStorm.
 * User: yuzhiyong
 * Date: 2019/3/31 0031
 * Time: 21:47
 */

use Workerman\Worker;
use Workerman\Lib\Timer;

require_once 'workerman/Autoloader.php';
require_once 'ClearConfig.php';
require_once __DIR__ . '/../' . 'simplewind\vendor\PHPExcel\PHPExcel.php';
date_default_timezone_set('Asia/Shanghai');
//read_all(DATA_FILE);//遍历文件夹下的所有文件

$task = new Worker();
// 开启多少个进程运行定时任务，注意业务是否在多进程有并发问题
$task->count = 1;
$task->onWorkerStart = function ($task) {
    // 每60秒执行一次
    $time_interval = 60;
    Timer::add($time_interval, function () {
        $time_now = date('H:i', time());//获取当前的小时数与分钟数
        if ($time_now == TIME_CLEAR) {
            read_all(DATA_FILE);
            read_all(DATA_LOGS);//遍历文件夹下的所有文件
            echo 'backup and del is  finish';
        }
    });
};


// 运行worker
Worker::runAll();
/***
 * @param $dir 输入的文件夹的地址
 * @return bool
 * 遍历文件夹下的所有文件，调用clear()函数将超过一个月的json备份并删除，调用clear()将超过一个月的log删除
 *
 */
function read_all($dir)
{
    if (!is_dir($dir)) return false;
    $handle = opendir($dir);
    if ($handle) {
        while (($fl = readdir($handle)) !== false) {
            $url = $dir . DIRECTORY_SEPARATOR . $fl;
            //如果不加  $fl!='.' && $fl != '..'  则会造成把$dir的父级目录也读取出来
            if (is_dir($url) && $fl != '.' && $fl != '..') {
                read_all($url);
            } else {
                if ($fl != '.' && $fl != '..') {
                    if (pathinfo($url, PATHINFO_EXTENSION) == 'json') {
                        clear($url, CLEAR_JSON);//对json文件进行处理
                    }
                    if (pathinfo($url, PATHINFO_EXTENSION) == 'log') {
                        clear($url, CLEAR_LOG);//对log文件进行处理
                    }

                }
            }
        }
    }
}

/***
 * /***
 * 如果输入的是json，则将数据备份到backup文件夹下，并删除
 * 如果输入的是log文件，则直接删除
 * @param $url 文件地址
 * @param $extension 后缀名
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Reader_Exception
 * @throws PHPExcel_Writer_Exception
 */
function clear($url, $extension)
{
    switch ($extension) {
        case 1://后缀为json
            if (strtotime("-1 month") > filemtime($url)) {
                $backup_url = str_replace(DATA_FILE, BACK_UP, $url);//获取备份路径，路径与/data文件大致相同，只是从/data变成了/backup
                $backup_file = pathinfo($backup_url, PATHINFO_DIRNAME);//备份路径文件夹
                create_file($backup_file);//若路径不存在，则创建
                copy($url, $backup_url);//备份到backup中
                add_excel($url, $backup_file, date("Y-m-d H:i:s", filemtime($url)), date("Y-m-d H:i:s", strtotime('now')));
                unlink($url);
            }
            break;
        case 2://后缀为log则直接删除
            if (strtotime("-1 week") > filemtime($url)) {
                unlink($url);
            }
            break;
        default:
            var_dump("传入了错误的后缀名到clear函数中");
    }
}

/***
 * @param $url
 * 判断该路径是否存在，若不存在则创建目录
 */
function create_file($url)
{
    if (!file_exists($url)) {
        mkdir($url, 0777, true);
    }
}

/***
 * 创建名为backup的excel表格，用于记录备份的时间，原地址和当前地址
 * @param $url 文件的地址（包括了当前文件的位置和文件名）
 * @param $backup_file 文件夹
 * @param $create_time 创建时间
 * @param $backup_time 备份时间
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Reader_Exception
 * @throws PHPExcel_Writer_Exception
 */
function add_excel($url, $backup_file, $create_time, $backup_time)
{
    $filePath = BACK_UP . '/backup.xlsx';//文件路径
    if (!file_exists($filePath)) {//若excel表格不存在则创建
        $excel_obj = new PHPExcel();
        $active_sheet = $excel_obj->setActiveSheetIndex(0);
        $active_sheet->setCellValue('A1', '文件名');
        $active_sheet->setCellValue('B1', '原地址');
        $active_sheet->setCellValue('C1', '备份地址');
        $active_sheet->setCellValue('D1', '创建时间');
        $active_sheet->setCellValue('E1', '备份时间');
        $excel_obj->getActiveSheet()->getColumnDimension('A')->setWidth(23);//设置A列的长度
        $excel_obj->getActiveSheet()->getColumnDimension('B')->setWidth(95);//设置B列的长度
        $excel_obj->getActiveSheet()->getColumnDimension('C')->setWidth(95);//设置C列的长度
        $excel_obj->getActiveSheet()->getColumnDimension('D')->setWidth(23);//设置D列的长度
        $excel_obj->getActiveSheet()->getColumnDimension('E')->setWidth(23);//设置E列的长度
        PHPExcel_IOFactory::createWriter($excel_obj, 'Excel2007')
            ->save($filePath);
    }

    $excel_obj = PHPExcel_IOFactory::load($filePath);
    $active_sheet = $excel_obj->getSheet(0); // 读取第一個工作表
    $highestRow = $active_sheet->getHighestRow(); // 取得总行数，也就是最后一行的行数
    $highestRow++;//最后一行+1，当前要插入的行数
    $active_sheet->setCellValue('A' . $highestRow, pathinfo($url, PATHINFO_BASENAME));//A是指第A列，$highestRow就是刚刚算出的要插入的行数， pathinfo($url, PATHINFO_BASENAME)是我自己设置的东西，你们要插入什么自己输入
    $active_sheet->setCellValue('B' . $highestRow, pathinfo($url, PATHINFO_DIRNAME));
    $active_sheet->setCellValue('C' . $highestRow, $backup_file);
    $active_sheet->setCellValue('D' . $highestRow, $create_time);
    $active_sheet->setCellValue('E' . $highestRow, $backup_time);
    PHPExcel_IOFactory::createWriter($excel_obj, 'Excel2007')
        ->save($filePath);//保存

}
